package com.panshi.servers.impl;

import com.panshi.mapper.ArticleMapper;
import com.panshi.pojo.ArticleVO;
import com.panshi.api.util.PageSizeVO;
import com.panshi.pojo.BeiUserVO;
import com.panshi.servers.ArticleService;
import com.panshi.utils.UserMessagePort;
import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author XiaoWangYa
 * @version 1.0
 * @date 2020/8/4 0004 下午 2:51
 */
@Slf4j
@Service
@ApiModel("文章Servers层")
public class ArticleServiceImpl implements ArticleService {

    @Autowired  // 文章Mapper
    private ArticleMapper yb_articleMapper;

    @Autowired  // 文章上/下架发送邮箱提醒用户
    private UserMessagePort userMessagePort;

    @Override   // 新增文章内容
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addArticleInfo(ArticleVO yb_Article_VO) {
        System.out.println(" 文章新增数据 --> " + yb_Article_VO);
        // 文章表新增数据
        int i = yb_articleMapper.addArticleInfo(yb_Article_VO);
        // 将新增的文章Id重新赋值, 添加动态/搜索表需要用到
        yb_Article_VO.setAid(yb_Article_VO.getAid());
        // 动态表新增数据
        yb_articleMapper.addDynamic(yb_Article_VO);
        // 搜索表新增数据
        yb_articleMapper.addSearch(yb_Article_VO);
        // 站内表新增数据
        yb_articleMapper.addInstation(yb_Article_VO);
        // 用户表文章数量 +1
        yb_articleMapper.upAssignUserArticleIssueSumAdd(yb_Article_VO.getUid());
    }

    @Override   // 新增站内消息数据
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addInstation(ArticleVO yb_Article_VO) {
        System.out.println(" 站内新增数据 --> " + yb_Article_VO);
        // 新增站内消息数据
        yb_articleMapper.addInstation(yb_Article_VO);
    }

    @Override   // 伪删除文章内容
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void deleteArticleInfo(int id) {
        // 删除动态表数据
        yb_articleMapper.deleteDynamic(id);
        // 删除搜索表数据
        yb_articleMapper.deleteSearch(id);

        // 查询 站内表新增所需数据
        ArticleVO articleVO = yb_articleMapper.queryAssignArticleInfo(id);
        // 新增站内表数据
        yb_articleMapper.addInstation(articleVO);
        // 用户表文章数量 -1
        yb_articleMapper.upAssignUserArticleIssueSumDel(articleVO.getUid());
        // 删除文章信息
        yb_articleMapper.deleteArticleInfo(id);
    }

    @Override   // 删除文章内容
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void delArticleInfo(int id) {
        System.out.println("文章Id --> " + id);
        // 删除动态表数据
        yb_articleMapper.deleteDynamic(id);
        // 删除搜索表数据
        yb_articleMapper.deleteSearch(id);

        // 查询 站内表新增所需数据
        ArticleVO articleVO = yb_articleMapper.queryAssignArticleInfo(id);
        if (articleVO != null) {
            // 新增站内表数据
            yb_articleMapper.addInstation(articleVO);
            // 用户表文章数量 -1
            yb_articleMapper.upAssignUserArticleIssueSumDel(articleVO.getUid());
        }

        // 删除文章信息
        yb_articleMapper.delArticleInfo(id);
    }

    @Override   // 查询文章咨询信息
    @Cacheable(value = "article", key = "#root.methodName + #p0.startIndex + #p0.tid") // 将数据存入缓存
    public List<ArticleVO> queryArticleInfo(PageSizeVO yb_PageSize_VO) {
        log.info(" 查询数据库 --> 查询文章咨询信息 ");
        return yb_articleMapper.queryArticleInfo(yb_PageSize_VO);
    }

    @Override   // 查询热门文章咨询信息
    @Cacheable(value = "article", key = "#root.methodName + #p0.startIndex + #p0.tid") // 将数据存入缓存
    public List<ArticleVO> queryHotArticleInfo(PageSizeVO yb_PageSize_VO) {
        log.info(" 查询数据库 --> 查询热门文章咨询信息 ");
        return yb_articleMapper.queryHotArticleInfo(yb_PageSize_VO);
    }

    @Override   // 管理员查询全部文章咨询信息
    @Cacheable(value = "article", key = "#root.methodName + #p0.startIndex + #p0.tid") // 将数据存入缓存
    public List<ArticleVO> adminQueryArticleInfo(PageSizeVO yb_PageSize_VO) {
        return yb_articleMapper.adminQueryArticleInfo(yb_PageSize_VO);
    }

    @Override   // 查询最新文章咨询信息
    @Cacheable(value = "article", key = "#root.methodName + #p0.startIndex + #p0.tid") // 将数据存入缓存
    public List<ArticleVO> queryNewArticleInfo(PageSizeVO yb_PageSize_VO) {
        log.info(" 查询数据库 --> 查询最新文章咨询信息 ");
        return yb_articleMapper.queryNewArticleInfo(yb_PageSize_VO);
    }

    @Override   // 查询指定文章咨询信息
    @Cacheable(value = "article", key = "#root.methodName + #aid") // 将数据存入缓存
    public ArticleVO queryAssignArticleInfo(int aid) {
        log.info(" 查询数据库 --> 查询指定文章咨询信息 ");
        return yb_articleMapper.queryAssignArticleInfo(aid);
    }

    @Override   // 查询文章总数量
    public int queryArticleCount() {
        return yb_articleMapper.queryArticleCount();
    }

    @Override   // 随机查询(专家推荐、大家都在看、其他看点、相关推荐)
    @Cacheable(value = "article", key = "#root.methodName + #p0.startIndex + #p0.tid + #p0") // 将数据存入缓存
    public List<ArticleVO> randomQueryArticle(PageSizeVO yb_PageSize_VO) {
        log.info(" 查询数据库 --> 随机查询(专家推荐、大家都在看、其他看点、相关推荐) ");
        return yb_articleMapper.randomQueryArticle(yb_PageSize_VO);
    }

    @Override   // 修改指定文章咨询信息
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void updateAssignArticleInfo(ArticleVO yb_Article_VO) throws Exception {
        System.out.println("文章数据 --> " + yb_Article_VO);
        // 动态/站内/搜索 下架/删除就是删除, 上架就是新增
        if ("0".equals(yb_Article_VO.getState())) { // 管理员上架文章
            // 动态表新增数据
            yb_articleMapper.addDynamic(yb_Article_VO);
            // 站内消息表新增数据
            yb_articleMapper.addInstation(yb_Article_VO);

            // 搜索表新增数据需要先查询出指定数据信息在进行新增操作
            ArticleVO articleVO = yb_articleMapper.queryAssignArticleInfo(yb_Article_VO.getAid());
            // 搜索表新增数据
            yb_articleMapper.addSearch(articleVO);
            // 用户表文章数量 +1
            yb_articleMapper.upAssignUserArticleIssueSumAdd(yb_Article_VO.getUid());

            // 文章上架发送邮箱提醒用户
            //userMessagePort.setemailarticle(yb_Article_VO.getUid(), Integer.valueOf(yb_Article_VO.getState()), yb_Article_VO.getA_title());
        // 管理员删除/下架文章
        } else if ("1".equals(yb_Article_VO.getState()) || "2".equals(yb_Article_VO.getState())) {
            // 新增站内表数据
            yb_articleMapper.addInstation(yb_Article_VO);
            // 删除动态表信息
            yb_articleMapper.deleteDynamic(yb_Article_VO.getAid());
            // 删除搜索表数据
            yb_articleMapper.deleteSearch(yb_Article_VO.getAid());
            // 用户表文章数量 -1
            yb_articleMapper.upAssignUserArticleIssueSumDel(yb_Article_VO.getUid());
            if ("2".equals(yb_Article_VO.getState())) {
                // 文章下架发送邮箱提醒用户
                //userMessagePort.setemailarticle(yb_Article_VO.getUid(), Integer.valueOf(yb_Article_VO.getState()), yb_Article_VO.getA_title());
            }
        } else {    // 用户自己修改文章
            // 新增站内表数据
            yb_articleMapper.addInstation(yb_Article_VO);
            // 删除动态表信息
            yb_articleMapper.deleteDynamic(yb_Article_VO.getAid());
            // 删除搜索表数据
            yb_articleMapper.deleteSearch(yb_Article_VO.getAid());
            // 用户表文章数量 -1
            yb_articleMapper.upAssignUserArticleIssueSumDel(yb_Article_VO.getUid());
            // 删除文章
            yb_articleMapper.delArticleInfo(yb_Article_VO.getAid());
        }
        yb_articleMapper.updateAssignArticleInfo(yb_Article_VO);//修改状态
        System.out.println("========================================修改");
        System.out.println(yb_Article_VO);
    }

    @Override   // 增加文章阅读量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addReadCount(int id) {
        yb_articleMapper.addReadCount(id);
    }

    @Override   // 增加文章评论量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addCount(int id) {
        yb_articleMapper.addCount(id);
    }

    @Override   // 增加文章收藏量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addCollectCount(int id) {
        yb_articleMapper.addCollectCount(id);
    }

    @Override   // 增加搜索表阅读量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addSearchReadCount(int id) {
        yb_articleMapper.addSearchReadCount(id);
    }

    @Override   // 增加搜索表评论量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addSearchCount(int id) {
        yb_articleMapper.addSearchCount(id);
    }

    @Override   // 增加搜索表收藏量
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public void addSearchCollectCount(int id) {
        yb_articleMapper.addSearchCollectCount(id);
    }

    @Override   // 查询指定用户信息
    @CacheEvict(value = "article", allEntries = true) // 清空缓存
    public BeiUserVO queryAssignUserInfo(int id) {
        return yb_articleMapper.queryAssignUserInfo (id);
    }

}
